#ifndef _FM1208_APP_H_
#define _FM1208_APP_H_

#include "fm1208_api.h"

#if _RFID_FUNCTION_ENABLE_

// 操作数据长度
#define FM1208_OPERATION_DATA_SIZE                   300
// 单次读写数据长度
#define FM1208_READ_WRITE_DATA_SIZE                  256

/**
 * @brief 启动 RATS 命令
 * 
 * @return bool  - 执行状态（true：成功 false：失败）
 */
extern bool FmcosRats(void);

/**
 * @brief 擦除目录
 *
 * @param DirectorId - 文件夹ID
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool FmcosEraseCardAllDirector(uint16_t DirectorId);

/**
 * @brief 建立子目录
 *
 * @param FileIdent    - 文件标识
 * @param FileSize     - 长度
 * @param Permission   - 权限
 * @param pFileName    - 文件名
 * @param NumnerOfName - 文件名称长度
 * @return bool        - 执行状态（true：成功 false：失败）
 */
extern bool FmcosCreateSubdirectoryDirectory(uint16_t FileIdent, uint16_t FileSize, uint16_t Permission, uint8_t *pFileName, uint8_t NumnerOfName);

/**
 * @brief 选择卡目录
 *
 * @param DirectorId - 目录
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool FmcosSelectCardDirector(uint16_t DirectorId);

/**
 * @brief 通过文件名进入目录
 *
 * @param FileName     - 文件名
 * @return bool        - 执行状态（true：成功 false：失败）
 */
extern bool FmcosEnterDirectoryByFileName(char *FileName);

/**
 * @brief 建立目录密钥文件
 *
 * @param FileType   - 文件类型
 * @param FileSpace  - 文件空间
 * @param Permission - 权限
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool FmcosCreateDirectoryKeyFile(uint8_t FileType, uint16_t FileSpace, uint16_t Permission);

/**
 * @brief 创建目录
 *
 * @param Permission       - 权限
 * @param NumberOfAttempts - 尝试次数
 * @param pSecretKey       - 密钥
 * @return bool            - 执行状态（true：成功 false：失败）
 */
extern bool FmcosCreateDirectoryKeyValue(uint16_t Permission, uint8_t NumberOfAttempts, uint8_t *pSecretKey);

/**
 * @brief 获取随机数
 *
 * @param SizeOfRandom - 随机数长度
 * @param pRandomOut   - 获取的随机数
 * @return bool            - 执行状态（true：成功 false：失败）
 */
extern bool FmcosGetRandomData(uint8_t SizeOfRandom, uint8_t *pRandomOut);

/**
 * @brief 外部验证
 *
 * @param pAuthenticationKey - 密钥
 * @param NumberOfKey        - 密钥长度
 * @return true
 * @return false
 */
extern bool FmcosExternalVerification(uint8_t *pAuthenticationKey, uint8_t NumberOfKey);

/**
 * @brief 创建二进制文件
 *
 * @param FileSize   - 文件大小
 * @param Permission - 权限
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool FmcosCreateBinFile(uint16_t FileSize, uint16_t Permission);

/**
 * @brief 写二进制文件
 *
 * @param WriteOffset - 文件偏移
 * @param pFileData   - 写入数据
 * @param DataSize    - 数据长度
 * @return bool       - 执行状态（true：成功 false：失败）
 */
extern bool FmcosWriteBinFile(uint16_t WriteOffset, uint8_t *pFileData, uint8_t DataSize);

/**
 * @brief 读取二进制文件
 *
 * @param ReadOffset - 读取偏移
 * @param pDataOut   - 输入数据
 * @param pSizeOut   - 数据长度
 * @return bool      - 执行状态（true：成功 false：失败）
 */
extern bool FmcosReadBinFile(uint16_t ReadOffset, uint8_t *pDataOut, uint16_t *pSizeOut);

#endif
#endif
